package chapter04

/**
 * Created with IntelliJ IDEA.
 * ClassName: Test02_Form
 * Package: chapter04
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 *          Date: 2023-06-18
 *          Time: 20:18
 */

object Test02_For {
  def main(args: Array[String]): Unit = {
    //Java中的for循环回顾
    //for(int i = 0;i<10;i++){System.out.println(i + "hello")}
    //缺点: 繁琐 定了很多数 范围 ++ --操作 退出循环的标志 边界不清晰

    //Scala 中的循环 带着i打印10次 hello
    //1.范围遍历
    //定义循环变量i  <- (范围) 取值一个一个取 赋给变量i
    // 1 to 10 就是从0到10
    for (i <- 1 to 10) {
      //这里的to 不是一个关键字 而是一个方法调用
      // (和运算符的本质一样) 1 是一个Int对象 调用的 to 方法
      println(i + ".hello world")
    }

    //Range类 创建了1到10的集合对象 从里面去数值
    for (i <- 1.to(10)) {
      //to的源码点过去是一个RichInt 隐式转换涉及到的内容
      //就是Int能调用的方法 就调用 不能叫用 就包装一下成别的类型去调用(隐式转换)
      //就转换为了RichInt
      println(i + ".本质也是方法调用")
    }

    //如果是不包含结束位置的话 Range 两个参数 使用的伴生对象
    for (i <- Range(1, 10)) {
      println(i + ".不包含")
    }

    //同理不取到10 until 直到的意思
    //这个until就是调用的Range
    for (i <- 1 until 10) {
      println(i + ".until 直到")
    }


    println("-------------------")
    //集合遍历 前面1 to 10 本质也是创建了一个集合
    //创建一个数组
    for (i <- Array(12, 32, 53)) {
      println(i)
    }
    //列表
    for (i <- List(12, 32, 53)) {
      println(i)
    }
    for (i <- Set(12, 32, 53)) {
      println(i)
    }

    println("-------------------------")
    //循环守卫
    for (i <- 1 to 10 if (i != 5)) {
      //如果 i!=5 就直接跳过
      println(i)
    }


    println("--------------")
    //循环步长
    //之间的to until 步长默认是1 伴生对象里面写好的
    for (i <- 1 to 10 by 2) {
      //打印的就是奇数
      //每次取一个然后 +2
      println(i)
    }
    for (i <- 13 to 30 by 3) {
      println(i)
    }
    for (i <- 30 to 13 by -2) {
      //倒叙 -2
      println(i)
    }
    for (i <- 10 to 1 by -1) {
      //从10 开始 1结束
      println(i)
    }
    //reverse 反转的意思 和上面一个意思
    for (i <- 1 to 10 reverse) {
      //从10 开始 1结束
      println(i)
    }
    //步长不能为0 为0直接抛异常
    //    for (i <- 10 to 1 by 0){
    //      //从10 开始 1结束
    //      println(i)
    //    }
    //能不能一次走半步
    //但是 步长 不能单独写浮点数 前面的范围也要是浮点数
    for (i <- 1.0 to 10.0 by 0.5) {
      //从10 开始 1结束
      println(i)
    }

    println("---------------------------")

    //嵌套循环 比如说 要遍历二维数组
    for (i <- 1 to 3) {
      for (j <- 1 to 3) {
        println("i = " + i + ", j = " + j)
      }
    }
    println("-------Scala写法-----------")
    for (i <- 1 to 3; j <- 1 to 3) {
      println("i = " + i + ", j = " + j)
    }

    println("------------------")
    //引入变量 比如说要输出两个关联的值
    for (i <- 1 to 10) {
      //这里定义的常量 怎么可以变了？
      val j = 10 - i
      println("i = " + i, "j = " + j)
    }
    for (i <- 1 to 10; j = 10 - i) {
      println("i = " + i, "j = " + j)
    }
    for {
      i <- 1 to 10;
      j = 10 - i
    }
    {
      println("i = " + i, "j = " + j)
    }

    //循环的返回值
    //默认情况之下 返回都是空 Unit
    val a: Unit = for (i <- 1 to 10) {
      println(i)
    }
    println(a) // ()

    println("---------------------")
    //yield 表示在当前循环 生成一个集合类型作为返回值 i就是要放的返回结果的元素
    val b = for (i <- 1 to 10) yield i * i
    println(b)
    //向量类 Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)


    //循环中断



  }
}
